#ifndef __CC_H__
#define __CC_H__

/* 根据sys_arch.txt的描述, cc.h文件主要完成协议栈内部使用的数据类型的定义.
 * cc.h文件还要完成几个基础功能的宏定义, 例如协议栈调试信息输出相关宏\大小端设定等.
 */

#include <stdint.h>
#include <stdio.h>

// Generate lwip's internal types from stdint

/* 定义平台无关的数据类型. */
typedef uint8_t u8_t;
typedef int8_t s8_t;
typedef uint16_t u16_t;
typedef int16_t s16_t;
typedef uint32_t u32_t;
typedef int32_t s32_t;
typedef uint32_t sys_prot_t; /* 临界保护类型型数据. */
typedef uint32_t mem_ptr_t; /* 内存地址类型数据. */


/* 定义同结构体封装相关的宏. */
#define PACK_STRUCT_BEGIN
#define PACK_STRUCT_STRUCT
#define PACK_STRUCT_END
#define PACK_STRUCT_FIELD(x) x
//#define PACK_STRUCT_USE_INCLUDES
#if 0
#if defined(__arm__) && defined(__ARMCC_VERSION)
    //
    // Setup PACKing macros for KEIL/RVMDK Tools
    //
    #define PACK_STRUCT_BEGIN __packed
    #define PACK_STRUCT_STRUCT
    #define PACK_STRUCT_END
    #define PACK_STRUCT_FIELD(x) x
#elif defined (__IAR_SYSTEMS_ICC__)
    //
    // Setup PACKing macros for IAR Tools
    //
    #define PACK_STRUCT_BEGIN
    #define PACK_STRUCT_STRUCT
    #define PACK_STRUCT_END
    #define PACK_STRUCT_FIELD(x) x
    #define PACK_STRUCT_USE_INCLUDES
#else
    //
    // Setup PACKing macros for GCC Tools
    //
    #define PACK_STRUCT_BEGIN
    #define PACK_STRUCT_STRUCT __attribute__ ((__packed__))
    #define PACK_STRUCT_END
    #define PACK_STRUCT_FIELD(x) x
#endif
#endif


/* 定义调试信息输出宏 */
//#include <assert.h>
//#include <stdio.h>
#define LWIP_DEBUG  /* 启用LWIP_DEBUGF输出内核调试信息. */
#define LWIP_PLATFORM_DIAG(x) { printf x ; }
#define LWIP_PLATFORM_ASSERT(x)  { printf(x); while(1); }
#define LWIP_ERROR(message, expression, handler) do { if (!(expression)) { printf(message); handler; } } while(0)


/* 定义与输出信息格式控制相关的宏 */
#define U16_F "hu"
#define S16_F "hd"
#define X16_F "hx"
#define U32_F "u"
#define S32_F "d"
#define X32_F "x"

#define X8_F  "02x"
#define SZT_F "u"

//#define LWIP_CHKSUM_ALGORITHM 2

/* 启用协议栈内部arch.h文件中定义的错误代码. */
#define LWIP_PROVIDE_ERRNO

/* 处理器定义为小端模式 */
#define BYTE_ORDER LITTLE_ENDIAN /* 几乎所有的ARM微控制器都是小端存储. */

/* 在v1.4.1中加入的一个获取系统当前时间的函数, 以ms为单位, 用于内核的超时管理. */
extern uint32_t sys_now(void);

#endif /* __CC_H__ */
